﻿using DAL;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BEL
{
    public class Comercio
    {

        #region atributos
        private List<Comercio> _sucursales;
        private Barrio _barrio;
        private Usuario _usuario;
        private List<Rubro> _rubros;
        private List<Tag> _lstTags;
        private int _comercioId;
        private List<Producto> _lstProducto;
        private String _comercioNombre;
        private String _comercioRUT;
        private String _comercioDireccion;
        private String _comercioTelefono;
        private String _comercioAnuncio;
        private String _comercioWeb;
        private String _comercioCoordenadas;
        private String _comercioEmail;
        private List<Comentario> _lstValoracionYComentarios;
        private List<RedSocial> _lstRedesSociales;
        private String _comlogo;
        private List<String> _lstImagenes;
        private Boolean _destacado;


        #endregion
        #region properties

        public Boolean Destacado
        {
            get { return _destacado; }
            set { _destacado = value; }
        }
        public String ComercioRUT
        {
            get { return _comercioRUT; }
            set { _comercioRUT = value; }
        }
        public List<String> LstImagenes
        {
            get { return _lstImagenes; }
            set { _lstImagenes = value; }
        }
        public String Comlogo
        {
            get { return _comlogo; }
            set { _comlogo = value; }
        }

        public String ComercioAnuncio
        {
            get { return _comercioAnuncio; }
            set { _comercioAnuncio = value; }
        }
        public List<RedSocial> LstRedesSociales
        {
            get { return _lstRedesSociales; }
            set { _lstRedesSociales = value; }
        }

        public List<Comentario> LstValoracionYComentarios
        {
            get { return _lstValoracionYComentarios; }
            set { _lstValoracionYComentarios = value; }
        }



        public List<Producto> LstProducto
        {
            get { return _lstProducto; }
            set { _lstProducto = value; }
        }
        public List<Comercio> Sucursales
        {
            get { return _sucursales; }
            set { _sucursales = value; }
        }


        public Barrio Barrio
        {
            get { return _barrio; }
            set { _barrio = value; }
        }


        public Usuario Usuario
        {
            get { return _usuario; }
            set { _usuario = value; }
        }


        public List<Rubro> Rubros
        {
            get { return _rubros; }
            set { _rubros = value; }
        }


        public List<Tag> LstTags
        {
            get { return _lstTags; }
            set { _lstTags = value; }
        }


        public int ComercioId
        {
            get { return _comercioId; }
            set { _comercioId = value; }
        }


        public String ComercioNombre
        {
            get { return _comercioNombre; }
            set { _comercioNombre = value; }
        }


        public String ComercioDireccion
        {
            get { return _comercioDireccion; }
            set { _comercioDireccion = value; }
        }

        public String ComercioTelefono
        {
            get { return _comercioTelefono; }
            set { _comercioTelefono = value; }
        }


        public String ComercioWeb
        {
            get { return _comercioWeb; }
            set { _comercioWeb = value; }
        }


        public String ComercioCoordenadas
        {
            get { return _comercioCoordenadas; }
            set { _comercioCoordenadas = value; }
        }


        public String ComercioEmail
        {
            get { return _comercioEmail; }
            set { _comercioEmail = value; }
        }
        #endregion

        #region constructores

        public Comercio(List<Comercio> sucursales, Barrio barrio, Usuario usuario, List<Rubro> rubros, List<Tag> lstTags,
            int comercioId, String anuncio, List<Producto> lstProducto, String comercioNombre, String comercioDireccion,
            String comercioTelefono, String comercioWeb, String comercioCoordenadas, String comercioEmail, List<Comentario> lstValoracionYComentarios,
            List<RedSocial> lstRedesSociales, String comlogo, List<String> lstImagenes)
        {

            _sucursales = sucursales;
            _barrio = barrio;
            _usuario = usuario;
            _rubros = rubros;
            _lstTags = lstTags;
            _comercioId = comercioId;
            _comercioAnuncio = anuncio;
            _lstProducto = lstProducto;
            _comercioNombre = comercioNombre;
            _comercioDireccion = comercioDireccion;
            _comercioTelefono = comercioTelefono;
            _comercioWeb = comercioWeb;
            _comercioCoordenadas = comercioCoordenadas;
            _comercioEmail = comercioEmail;
            _lstValoracionYComentarios = lstValoracionYComentarios;
            _lstRedesSociales = lstRedesSociales;
            _comlogo = comlogo;
            _lstImagenes = lstImagenes;
            

        }

        public Comercio()
        {
        }

        public Comercio(int comercioId)
        {
            _comercioId = comercioId;
        }

        public Comercio(Barrio barrio,
            int comercioId, String anuncio, String comercioNombre, String comercioDireccion,
            String comercioTelefono, String comercioWeb, String comercioCoordenadas, String comercioEmail, List<Comentario> lstValoracionYComentarios,
            String comlogo)
        {           
            _barrio = barrio;
            _comercioId = comercioId;
            _comercioAnuncio = anuncio;           
            _comercioNombre = comercioNombre;
            _comercioDireccion = comercioDireccion;
            _comercioTelefono = comercioTelefono;
            _comercioWeb = comercioWeb;
            _comercioCoordenadas = comercioCoordenadas;
            _comercioEmail = comercioEmail;
            _lstValoracionYComentarios = lstValoracionYComentarios;           
            _comlogo = comlogo;   
        }

        #endregion

        #region funciones

        public static Comercio BuscarComercioPorId(int id){
            DALComercio dal = new DALComercio();
            SqlDataReader dr = dal.buscarComercioPorId(id);
            Comercio c = new Comercio();
            if (dr.Read()) {
                c.ComercioId = Convert.ToInt32(dr["ComId"]);
                c.ComercioNombre = Convert.ToString(dr["ComNombre"]);
                c.ComercioDireccion = Convert.ToString(dr["ComDireccion"]);
                c.ComercioTelefono = Convert.ToString(dr["ComTelefono"]);
                c.ComercioWeb = Convert.ToString(dr["ComWeb"]);
                c.ComercioCoordenadas = Convert.ToString(dr["ComCoordenadas"]);
                c.Comlogo = Convert.ToString(dr["ComLogo"]);
                c.ComercioEmail = Convert.ToString(dr["ComEmail"]);
                c.ComercioAnuncio = Convert.ToString(dr["ComAnuncio"]);
                c.Barrio = Barrio.BuscarBarrioPorId(Convert.ToInt32(dr["BarId"]));                
            }
            return c; 
        }
        public List<Comercio> BuscarComerciosPorRubro(int RubroId)
        {
            return null;
        }
        public List<Tag> BuscarTagsPorComercio(int ComercioId)
        {
            return null;
        }
        public Boolean AltaComercio(Comercio comercio)
        {
            Boolean retorno = false;
            if (DALComercio.AltaComercio(this.toHashtable(), comercio.Usuario.toHashtable(), convertirSucursales(), convertirRubros(), convertirTags(), listaRedesSociales()) > 0)
            {
                retorno = true;
            }
            else
            {
                retorno = false;
            }
            return retorno;
        }
        private List<string> convertirTags()
        {
            List<string> retorno = new List<string>();
            foreach (Tag tag in this._lstTags)
            {
                retorno.Add(tag.TagNombre);
            }
            return retorno;
        }
        private List<Hashtable> listaRedesSociales()
        {
            List<Hashtable> retorno = new List<Hashtable>();
            foreach (RedSocial red in this.LstRedesSociales)
            {

                retorno.Add(red.toHashtable());
            }
            return retorno;
        }
        private List<int> convertirSucursales()
        {
            List<int> retorno = new List<int>();
            foreach (Comercio com in this.Sucursales)
            {
                retorno.Add(com._comercioId);
            }
            return retorno;
        }
        private List<int> convertirRubros()
        {
            List<int> retorno = new List<int>();
            foreach (Rubro rub in this.Rubros)
            {
                retorno.Add(rub.RubId);
            }
            return retorno;
        }
        public Hashtable toHashtable()
        {
            Hashtable hash = new Hashtable();

            if (!string.IsNullOrEmpty(this.ComercioId.ToString()))
            {
                hash.Add("ComId", this.ComercioId);
            }
            hash.Add("ComRUT", this.ComercioRUT);
            hash.Add("ComNombre", this.ComercioNombre);
            hash.Add("ComDireccion", this.ComercioDireccion);
            hash.Add("ComTelefono", this.ComercioTelefono);
            hash.Add("ComWeb", this.ComercioWeb);
            hash.Add("ComCoordenadas", this.ComercioCoordenadas);
            //    hash.Add("ComLogo", this.comerciologo);
            hash.Add("ComEmail", this.ComercioEmail);
            hash.Add("ComAnuncio", this._comercioAnuncio);
            hash.Add("UsuId", this.Usuario.UsuarioId);
            hash.Add("BarId", this.Barrio.BarId);

            return hash;
        }
        public void fromHashtable(Hashtable ht)
        {

            /*  this.UsuarioId = Convert.ToInt32(ht["UsuarioId"].ToString());
              this.UsuarioNombre = ht["UsuarioNombre"].ToString();
              this.UsuarioPassword = ht["UsuarioPassword"].ToString();
              this.Rol = this.rolDeString(ht["Rol"].ToString());
              */
        }
        public Comercio ObtenerComercioPorNombre(string nombre)
        {
            SqlDataReader drResults = DALComercio.ObtenerComercioPorNombre(nombre);
            drResults.Read();
            Comercio com = new Comercio();
            com.ComercioId = (DBNull.Value == drResults["ComId"]) ? 0 : (int)drResults["ComId"];
            com.ComercioNombre = (DBNull.Value == drResults["ComNombre"]) ? string.Empty : (string)drResults["ComNombre"];
            drResults.Close();

            return com;
        }
        public List<string> ObtenerComercios(string prefix)
        {
            List<string> retorno = new List<string>();
            SqlDataReader drResults = DALComercio.ObtenerComercios(prefix);
            while (drResults.Read())
                retorno.Add(((DBNull.Value == drResults["ComNombre"]) ? string.Empty : (string)drResults["ComNombre"]));
            drResults.Close();

            return retorno;

        }
        public List<Coordenadas> ObtenerCoordenadasFiltros(int _Barrio, int _Rubro, string _Tag)
        {
            List<Coordenadas> coords = new List<Coordenadas>();
            SqlDataReader drResults = DALComercio.ObtenerCoordenadasFiltros(_Barrio,_Rubro,_Tag);
            while (drResults.Read())
            coords.Add(CoordenadaSegunDR(drResults));
            drResults.Close();

            return coords;
            
        }

        private Coordenadas CoordenadaSegunDR(SqlDataReader drResults)
        {
            Coordenadas coordenada = new Coordenadas();
            coordenada.ComercioDireccion = (DBNull.Value == drResults["ComDireccion"]) ? string.Empty : (string)drResults["ComDireccion"];
            coordenada.ComercioNombre = (DBNull.Value == drResults["ComNombre"]) ? string.Empty : (string)drResults["ComNombre"];
            coordenada.ComercioTelefono = (DBNull.Value == drResults["ComTelefono"]) ? string.Empty : (string)drResults["ComTelefono"];
            //c.Comlogo = ((DBNull.Value == drResults["ComNombre"]) ? string.Empty : (string)drResults["ComNombre"]));
            string coordenadas = (DBNull.Value == drResults["ComCoordenadas"]) ? string.Empty : (string)drResults["ComCoordenadas"];
            int contador = 0;
            for (int i = 0; i < coordenadas.Length; i++)
            {
                if (coordenadas[i] == ';')
                {
                    contador = i;
                }
            }

            coordenada.Latitud = coordenadas.Substring(0, contador);
            coordenada.Longitud = coordenadas.Substring(contador + 1);
            return coordenada;
        }

        public static Comercio ObtenerComercioPorUsuario(int usuId)
        {
            SqlDataReader drResults = DALComercio.ObtenerComercioPorUsuario(usuId);
            drResults.Read();
            Comercio com = new Comercio();
            com = comercioDesdeDR(drResults);
            drResults.Close();

            return com;
        }
        private static Comercio comercioDesdeDR(SqlDataReader drResults)
        {
        Comercio com = new Comercio();
 	    com.ComercioId = (DBNull.Value == drResults["ComId"]) ? 0 : (int)drResults["ComId"];
        com.ComercioNombre = (DBNull.Value == drResults["ComNombre"]) ? string.Empty : (string)drResults["ComNombre"];
        com.ComercioRUT = (DBNull.Value == drResults["ComRUT"]) ? string.Empty : (string)drResults["ComRUT"];
        com.ComercioDireccion = (DBNull.Value == drResults["ComDireccion"]) ? string.Empty : (string)drResults["ComDireccion"];
        com.ComercioTelefono = (DBNull.Value == drResults["ComTelefono"]) ? string.Empty : (string)drResults["ComTelefono"];
        com.ComercioWeb = (DBNull.Value == drResults["ComWeb"]) ? string.Empty : (string)drResults["ComWeb"];
        //BARRIO    
        com.Barrio = Barrio.BuscarBarrioPorId((DBNull.Value == drResults["BarId"]) ? 0 : (int)drResults["BarId"]);
        com.ComercioEmail = (DBNull.Value == drResults["ComEmail"]) ? string.Empty : (string)drResults["ComEmail"];
        com.ComercioCoordenadas = (DBNull.Value == drResults["ComCoordenadas"]) ? string.Empty : (string)drResults["ComCoordenadas"];
        // tags
        com.LstTags = Tag.BuscarTagsPorComercio(com.ComercioId);
        com.ComercioAnuncio = (DBNull.Value == drResults["ComAnuncio"]) ? string.Empty : (string)drResults["ComAnuncio"];
        // sucursales
        com.Sucursales = SucursalesSegunDR(DALComercio.ObtenerSucursales(com.ComercioId));
        // rubros
        com.Rubros = Rubro.BuscarRubrosXComercio(com.ComercioId);
        // redes sociales
        com.LstRedesSociales = RedSocial.BuscarRedesDeComercio(com.ComercioId);

    return com;
}
        private static List<Comercio> SucursalesSegunDR(SqlDataReader sqlDataReader)
        {
            List<Comercio> retorno = new List<Comercio>();
            
            while (sqlDataReader.Read())
                  retorno.Add(Sucursal(sqlDataReader));
            sqlDataReader.Close();

            return retorno;
        }
        private static Comercio Sucursal(SqlDataReader sqlDataReader)
        {
            Comercio com = new Comercio();
            com.ComercioId = (DBNull.Value == sqlDataReader["ComId"]) ? 0 : (int)sqlDataReader["ComId"];
            com.ComercioNombre = (DBNull.Value == sqlDataReader["ComNombre"]) ? string.Empty : (string)sqlDataReader["ComNombre"];

            return com;
        }
        public bool ModificarComercio(Comercio comercio)
        {
            Boolean retorno = false;
            if (DALComercio.ModificarComercio(comercio.ComercioId, this.toHashtable(), comercio.Usuario.toHashtable(), convertirSucursales(), convertirRubros(), convertirTags(), listaRedesSociales()) > 0)
            {
                retorno = true;
            }
            else
            {
                retorno = false;
            }
            return retorno;
        }
        public static List<Comercio> BuscarSucursales(int ComercioId)
        {
            DALComercio dalcomercio = new DALComercio();
            SqlDataReader dr = dalcomercio.BuscarSucursales(ComercioId);
            List<Comercio> ret = new List<Comercio>();
            while (dr.Read())
            {
                Comercio c = new Comercio();
                c.ComercioId = Convert.ToInt32(dr["ComId"]);
                c.ComercioNombre = Convert.ToString(dr["ComNombre"]);
                c.ComercioDireccion = Convert.ToString(dr["ComDireccion"]);
                c.ComercioTelefono = Convert.ToString(dr["ComTelefono"]);
                c.ComercioWeb = Convert.ToString(dr["ComWeb"]);
                c.ComercioCoordenadas = Convert.ToString(dr["ComCoordenadas"]);
                c.Comlogo = Convert.ToString(dr["ComLogo"]);
                c.ComercioEmail = Convert.ToString(dr["ComEmail"]);
                c.ComercioAnuncio = Convert.ToString(dr["ComAnuncio"]);
                c.Barrio = Barrio.BuscarBarrioPorId(Convert.ToInt32(dr["BarId"]));
                ret.Add(c);
            }
            return ret;
        }

        #endregion


        public List<Coordenadas> ObtenerCoordenadasAll()
        {
            List<Coordenadas> coords = new List<Coordenadas>();
            SqlDataReader drResults = DALComercio.ObtenerCoordenadasAll();
            while (drResults.Read())
                coords.Add(CoordenadaSegunDR(drResults));
            drResults.Close();

            return coords;
        }

        public List<Coordenadas> ObtenerComerciosPrincipal(string filtro)
        {
            List<Coordenadas> coords = new List<Coordenadas>();
            SqlDataReader drResults = DALComercio.ObtenerCoordenadasComerciosPrincipal(filtro);
            while (drResults.Read())
                coords.Add(CoordenadaSegunDR(drResults));
            drResults.Close();

            return coords;
        }




        public List<Comercio> ComerciosMejorPuntuados()
        {
            List<Comercio> ret = new List<Comercio>();
            DALComercio dal = new DALComercio();
            SqlDataReader dr = dal.ComerciosMejorPuntuados();
            while (dr.Read())
            {
                Comercio c = new Comercio();
                c.ComercioId = Convert.ToInt32(dr["ComId"]);
                c.ComercioNombre = Convert.ToString(dr["ComNombre"]);
                c.ComercioDireccion = Convert.ToString(dr["ComDireccion"]);
                c.ComercioTelefono = Convert.ToString(dr["ComTelefono"]);
                c.ComercioWeb = Convert.ToString(dr["ComWeb"]);
                c.ComercioCoordenadas = Convert.ToString(dr["ComCoordenadas"]);
                c.Comlogo = Convert.ToString(dr["ComLogo"]);
                c.ComercioEmail = Convert.ToString(dr["ComEmail"]);
                c.ComercioAnuncio = Convert.ToString(dr["ComAnuncio"]);
                c.Barrio = Barrio.BuscarBarrioPorId(Convert.ToInt32(dr["BarId"]));
                ret.Add(c);
            }
            return ret;
        }

        public List<Comercio> ComerciosDestacados()
        {
            List<Comercio> ret = new List<Comercio>();
            DALComercio dal = new DALComercio();
            SqlDataReader dr = dal.ComerciosDestacados();
            while (dr.Read())
            {
                Comercio c = new Comercio();
                c.ComercioId = Convert.ToInt32(dr["ComId"]);
                c.ComercioNombre = Convert.ToString(dr["ComNombre"]);
                c.ComercioDireccion = Convert.ToString(dr["ComDireccion"]);
                c.ComercioTelefono = Convert.ToString(dr["ComTelefono"]);
                c.ComercioWeb = Convert.ToString(dr["ComWeb"]);
                c.ComercioCoordenadas = Convert.ToString(dr["ComCoordenadas"]);
                c.Comlogo = Convert.ToString(dr["ComLogo"]);
                c.ComercioEmail = Convert.ToString(dr["ComEmail"]);
                c.ComercioAnuncio = Convert.ToString(dr["ComAnuncio"]);
                c.Barrio = Barrio.BuscarBarrioPorId(Convert.ToInt32(dr["BarId"]));
                c.Destacado = true;
                ret.Add(c);
            }
            return ret;
        }
     
    }
}
